package com.uenpay.im.service;

import android.os.AsyncTask;
import android.text.TextUtils;

import com.qiyunxin.android.http.utils.FileUtils;
import com.qiyunxin.android.http.utils.Utils;
import com.qyx.android.activity.QiYunXinApplication;
import com.qyx.android.database.TalkMsgManager;
import com.qyx.android.message.MessageUtils;
import com.qyx.android.message.type.MsgContentType;
import com.qyx.android.protocol.BaseContentModel;
import com.qyx.android.protocol.QyxMsg;
import com.qyx.android.utilities.DateUtils;
import com.uenpay.im.IMApplication;
import com.uenpay.im.configuration.APIConfiguration;

import org.json.JSONObject;

/**
 * 自定义消息类型管理
 *
 * @author SL
 * @copyRight http://www.qiyunxin.com
 */
public class QyxMessageUtils extends MessageUtils {

    private TalkMsgManager mTalkMsgManager = new TalkMsgManager();
    private FileUtils fileUtils = new FileUtils(QiYunXinApplication
            .getInstance().getAppName());

    /**
     * 发送消息内容json结构。自定义消息时，APP根据自己需求往json中添加数据
     */
    @Override
    protected JSONObject sendMsgContentJson(QyxMsg mQyxMsg) {
        return JsonBeanTransf.msgBean2Json(mQyxMsg);
    }

    @Override
    protected BaseContentModel getContentModel(int msgContentType,
                                               JSONObject jsonObject) {
        return JsonBeanTransf.json2MsgBean(jsonObject, msgContentType);
    }

    /**
     * 消息 Model传递参数的时候需将消息Model转为Json字符串
     */
    @Override
    protected BaseContentModel gsonToContentModel(int msgContentType,
                                                  JSONObject jsonObject) {
    return JsonBeanTransf.gson2MsgBean(jsonObject,msgContentType);
    }

    // /**
    // * 收到消息解析未知消息类型。自定义消息时，APP自己解析json中的数据。
    // */
    // @Override
    // protected QyxMsg receiveMsgContentJson(JSONObject json, QyxMsg mQyxMsg) {
    // return mQyxMsg;
    // }

    /**
     * 是否保存在系统消息表中(APP自定义消息类型10000以后才会回调到该方法) 所有SDK未知的消息类型都会存在系统表中
     */
    @Override
    protected boolean isSaveToSystemInfo(int messageContentType) {
        return true;
    }

    /**
     * 是否保存在聊天数据表中(APP自定义消息类型10000以后才会回调到该方法) 凡是涉及聊天消息的数据都会保存在会话表中
     */
    @Override
    protected boolean isSaveToTalkMsgInfo(int MsgContentType) {
        return true;
    }

    // /**
    // * 根据聊天类型获取回话列表首页最后一条消息内容
    // */
    // @Override
    // protected String getTopMsgLastMsgContent(int msgContentType) {
    // return IMApplication.GetMsgContentTypeName(msgContentType);
    // }

    /**
     * 下载消息中附件 SDK未处理任何附件
     */
    @Override
    protected void downloadMsgEnclosure(QyxMsg qyxMsg) {
        if (qyxMsg.baseContentModel != null
                && qyxMsg.baseContentModel.getAttachmentModel() != null) {
            if (TextUtils.isEmpty(qyxMsg.baseContentModel.getAttachmentModel()
                    .getFileId())
                    || TextUtils.isEmpty(qyxMsg.baseContentModel
                    .getAttachmentModel().getFileHash())
                    || Utils.getNetworkType(IMApplication.getAppContext()) == 0
                    || Utils.getNetworkType(IMApplication.getAppContext()) == 2) {
                return;
            }
            /** 仅在WiFi环境下载附件 **/
            String url = APIConfiguration.getFileDownloadPath(
                    qyxMsg.baseContentModel.getAttachmentModel().getFileId(),
                    qyxMsg.baseContentModel.getAttachmentModel().getFileHash());
            new DownloadAttacheAsyncTask(url, qyxMsg.msg_content_type,
                    qyxMsg._id).execute();
        }

    }

    /**
     * 下载消息附件
     *
     * @author SL
     */
    private class DownloadAttacheAsyncTask extends AsyncTask<Void, Void, Void> {
        private String url;
        private int category;
        private String path;
        private long id;

        public DownloadAttacheAsyncTask(String _url, int _category, long _id) {
            url = _url;
            category = _category;
            id = _id;
        }

        @Override
        protected Void doInBackground(Void... arg0) {
            if (category == MsgContentType.AUDIO) {
                path = fileUtils.downloadFile1(url, "amr",
                        DateUtils.getCurrentMills() + ".amr", null);
            } else if (category == MsgContentType.PIC) {
                path = fileUtils.downloadFile1(url, "jpg",
                        DateUtils.getCurrentMills() + ".jpg", null);
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            if (!TextUtils.isEmpty(path)) {
                mTalkMsgManager.updateMsgFilePath(id, path);
            }
        }
    }
}
